{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "0894a735",
   "metadata": {},
   "outputs": [],
   "source": [
    "from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig\n",
    "import torch\n",
    "\n",
    "TORCH_DTYPE = 'bfloat16'\n",
    "nf4_config = BitsAndBytesConfig(\n",
    "    load_in_4bit=True,\n",
    "    bnb_4bit_quant_type='nf4',\n",
    "    bnb_4bit_use_double_quant=True,\n",
    "    bnb_4bit_compute_dtype=getattr(torch, TORCH_DTYPE)\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "6daae66f",
   "metadata": {},
   "outputs": [],
   "source": [
    "tokenizer = AutoTokenizer.from_pretrained('mesolitica/mistral-1.1b-32768-fpf')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "0da5df04",
   "metadata": {},
   "outputs": [],
   "source": [
    "model = AutoModelForCausalLM.from_pretrained(\n",
    "    'mesolitica/mistral-1.1b-32768-fpf',\n",
    "    use_flash_attention_2 = True,\n",
    "    quantization_config = nf4_config\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "07881cfc",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'input_ids': tensor([[    1,  1537,   282,   276, 28747,   524, 28780,  3701,  8582,   979,\n",
       "         28708, 28804,    13, 28798,  1067,  4209, 28747]], device='cuda:0'), 'attention_mask': tensor([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]], device='cuda:0')}"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "prompt = '<s>Soalan: KWSP tu apa?\\nJawapan:'\n",
    "inputs = tokenizer([prompt], return_tensors='pt', add_special_tokens=False).to('cuda')\n",
    "inputs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "67d3c231",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Setting `pad_token_id` to `eos_token_id`:2 for open-end generation.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<s> Soalan: KWSP tu apa?\n",
      "Jawapan: 1.Pengeluaran KWSP pada hari Isnin, 10 Jun 2021 adalah berikutan pengeluaran khas pada hari Jumaat. 2.Kadar caruman ini sepatutnya dipersetujui oleh ahli-ahli selepas pembentangan Bajet 2022, pada hari ini. 3.Berapa ramai ahli Parlimen yang bersetuju bahawa RM2.06 bilion yang dibelanjakan dengan memanfaatkan RM54 bilion dan RM16.6 bilion untuk keperluan perbelanjaan Rakyat? Adakah mereka sedar akan keselamatan mereka? Ada sebab dan kenapa jumlah yang meningkat 70% itu dijangka terjejas dengan kemerosotan ekonomi dunia akibat Covid-19. 4.Tidak ada seorang pun ahli Parlimen ini yang mempunyai kerisauan atau keputusan sendiri untuk tidak mengambil kisah apa yang dikatakan oleh ahli Parlimen. Jika betul-betul rakyat mahu melihat seseorang itu mati dan tidak bersedia untuk hidup, maka kita diberitahu 5.Bagi mereka yang benar-benar hendak mengisi masa lapang boleh melakukannya dengan bekerja. 6.Mengambil kira golongan M40 dan T20 yang merancang untuk mengundi pada PRU15 kelak, ahli-ahli diingatkan untuk berhati-hati dan elakkan daripada menggunakan wang KWSP ini.</s>\n"
     ]
    }
   ],
   "source": [
    "generate_kwargs = dict(\n",
    "    inputs,\n",
    "    max_new_tokens=512,\n",
    "    top_p=0.95,\n",
    "    top_k=50,\n",
    "    temperature=0.9,\n",
    "    do_sample=True,\n",
    "    num_beams=1,\n",
    "    repetition_penalty=1.05,\n",
    ")\n",
    "r = model.generate(**generate_kwargs)\n",
    "print(tokenizer.decode(r[0]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "4efaf03f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'input_ids': tensor([[    1,  1537,   282,   276, 28747,   446,   269, 10405,  6125,   748,\n",
       "           515,   519,  2117,   290,   491,   276,   307,  8608,   462, 28719,\n",
       "           491, 28804,    13, 28798,  1067,  4209, 28747]], device='cuda:0'), 'attention_mask': tensor([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
       "         1, 1, 1]], device='cuda:0')}"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "prompt = '<s>Soalan: kenapa malaysia suka makan nasi lemak?\\nJawapan:'\n",
    "inputs = tokenizer([prompt], return_tensors='pt', add_special_tokens=False).to('cuda')\n",
    "inputs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "bdc41dda",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Setting `pad_token_id` to `eos_token_id`:2 for open-end generation.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<s> Soalan: kenapa malaysia suka makan nasi lemak?\n",
      "Jawapan: (A) ianya mahal dari segi nasi (b) kerana ia disediakan mengikut citarasa sendiri (c) ianya mahal mengikut pemakanan (d) harga yang mahal (e) kerana ia mempunyai kandungan zat dan nutrisi yang baik. Namun, mungkin ianya tak sepadan dengan selera nasi yang dibayar oleh anda sekarang, bukan? [1] Tidak dinafikan bahawa jumlah nasi bersama nasi lemak itu agak banyak, tapi rasanya boleh makan mengikut kesegaran nasi di samping tidak menyebabkan kita nampak nasi lemak terkenal, tetapi ada juga jenis nasi yang dikukus dan yang dipilih dan dijual dikedai-kedai sahaja. [2] Mungkin ianya bermaksud nasi lemak, nasi ayam goreng, nasi dagang dan makan nasi nasi goreng itu sendiri. Seperti bancuhannya nasi lemak yang kaya dengan protein dan kuantiti yang cukup tinggi, menjadikan ia berguna untuk kesihatan jantung dan paru-paru. [3] Sesetengah daripada bangsa-bangsa lain sememangnya kurang bersetuju dengan nasi, kerana ianya menggunakan kuantiti yang tepat. Ia hanya boleh dicampurkan dengan nasi dan masak nasi yang diperlukan untuk memastikan nasi yang dihasilkan betul-betul berkhasiat, supaya nasi yang dimasak betul-betul bersih, sihat, tahan lama dan diterima selama mana mungkin, semua terpulang kepada pilihan anda. Kesimpul\n"
     ]
    }
   ],
   "source": [
    "generate_kwargs = dict(\n",
    "    inputs,\n",
    "    max_new_tokens=512,\n",
    "    top_p=0.95,\n",
    "    top_k=50,\n",
    "    temperature=0.9,\n",
    "    do_sample=True,\n",
    "    num_beams=1,\n",
    "    repetition_penalty=1.05,\n",
    ")\n",
    "r = model.generate(**generate_kwargs)\n",
    "print(tokenizer.decode(r[0]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "6581db3c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'input_ids': tensor([[    1,  1537,   282,   276, 28747, 22399, 12209,   276,  5311,  4499,\n",
       "          6635,   381,  1318, 28804,    13, 28798,  1067,  4209, 28747]],\n",
       "       device='cuda:0'), 'attention_mask': tensor([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]],\n",
       "       device='cuda:0')}"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "prompt = '<s>Soalan: kerajaan Madani bagus x?\\nJawapan:'\n",
    "inputs = tokenizer([prompt], return_tensors='pt', add_special_tokens=False).to('cuda')\n",
    "inputs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "ddcf5217",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Setting `pad_token_id` to `eos_token_id`:2 for open-end generation.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<s> Soalan: kerajaan Madani bagus x?\n",
      "Jawapan: Tidak. Kerana, kerajaan membina dan menyusun semula masyarakat bumiputera dalam pelbagai bidang seperti ekonomi, pendidikan, kesihatan, kebudayaan dan kesenian, ada sebab ketidakpuasan hati masyarakat bumiputera terhadap gagasan “Melayu” yang diperjuangkan. (Ada lagi 6 tulisan, jika ada gagasan ia tetapi gagasan ini hanya dilaksanakan oleh kerajaan tanpa sebarang sekatan).[1] Penggunaan ekonomi meleset: Masyarakat bumiputera tidak mengenali ekonomi sesuatu kaum atau agama tertentu. Hakikatnya, mereka juga mengabaikan sumber ekonomi seperti sumber hasil pertanian, modal perusahaan, dan sumber manusia. Hakikatnya, ekonomi bumiputera itu sendiri tidak mampu memberi sumbangan yang besar terhadap ekonomi negara, khasnya ketika ekonomi global sedang berhadapan dengan pembangunan yang pesat. [2] Mereka turut menerima idea “mengasingkan” ekonomi kepada sains dan teknologi (kemudian meningkatkan pertumbuhan ekonomi) dan menolak unsur-unsur yang dipupuk. Dalam dunia moden, ekonomi banyak menggunakan kaedah lama. Contohnya, kaedah sains dan teknologi (seperti pembelajaran sains dan matematik); kaedah yang dapat membantu komuniti bumiputera untuk mendapatkan ilmu pengetahuan, menaiktarafkan kualiti hidup melalui laluan birokrasi yang cekap. Kaedah ini bersifat “\n"
     ]
    }
   ],
   "source": [
    "generate_kwargs = dict(\n",
    "    inputs,\n",
    "    max_new_tokens=512,\n",
    "    top_p=0.95,\n",
    "    top_k=50,\n",
    "    temperature=0.9,\n",
    "    do_sample=True,\n",
    "    num_beams=1,\n",
    "    repetition_penalty=1.05,\n",
    ")\n",
    "r = model.generate(**generate_kwargs)\n",
    "print(tokenizer.decode(r[0]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "6d6d08c4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'input_ids': tensor([[    1,  1537,   282,   276, 28747,  8338,   314,   676, 28708,   307,\n",
       "           491,  4430, 20933, 18008,  7517,   314, 16179,  2794, 28718,    13,\n",
       "         28798,  1067,  4209, 28747]], device='cuda:0'), 'attention_mask': tensor([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]],\n",
       "       device='cuda:0')}"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "prompt = '<s>Soalan: macam mana nak install awscli dalam ubuntu\\nJawapan:'\n",
    "inputs = tokenizer([prompt], return_tensors='pt', add_special_tokens=False).to('cuda')\n",
    "inputs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "ffcbe20b",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Setting `pad_token_id` to `eos_token_id`:2 for open-end generation.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<s> Soalan: macam mana nak install awscli dalam ubuntu\n",
      "Jawapan: Bolehkah saya menggunakan AWSCLD dalam python untuk menyaring percubaan saya dari kod yang diberikan? Mesej ralat yang anda perlukan adalah kerana anda cuba memasang awscli-cli secara langsung di GitHub, tetapi ia tidak berfungsi. Anda boleh mencuba memasangnya dengan perpustakaan Python yang dipanggil PyOWSH atau melakukan ini: ``` sudo apt-get update-python-org/build-env --recursive-python-code=`git add --user` ``` Kemudian, anda boleh menjalankan `pip show setup_install_amd64` (versi akan dikonfigurasi), yang merupakan versi yang disediakan oleh pip. ```bash pyenv -I cd pyenv | sudo pyenv/bin/activate python --version ``` Jika pembinaan gagal, anda boleh memeriksa bahagian lain failnya, termasuk arahan-arahan dalam talian (`pyenv --RECURSION`), dan memuatkan mesej ke dalam perpustakaan Python. ```bash pip show setup_install_amd64 ``` Jika anda masih mengalami masalah, anda boleh memeriksa sama ada masalah dengan pemasangan awscli-cli secara langsung. Jika ya, anda perlu mengkonfigurasi pyenv dengan betul untuk membuat beberapa persekitaran maya baru, dan jika ia disertakan dengan pakej dan versi Python mungkin menghadapi masalah dengan kod. Untuk mencapai ini, anda boleh menggunakan pakej 'Python' untuk membuat persekitaran maya baru, dan jika ia sepadan dengan 'pyenv', anda harus melaksanakan perintah\n"
     ]
    }
   ],
   "source": [
    "generate_kwargs = dict(\n",
    "    inputs,\n",
    "    max_new_tokens=512,\n",
    "    top_p=0.95,\n",
    "    top_k=50,\n",
    "    temperature=0.9,\n",
    "    do_sample=True,\n",
    "    num_beams=1,\n",
    "    repetition_penalty=1.05,\n",
    ")\n",
    "r = model.generate(**generate_kwargs)\n",
    "print(tokenizer.decode(r[0]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "560a1431",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
